home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 26 / Cream of the Crop 26.iso / os2 / pvm34b3.zip / pvm34b3 / pvm3 / gexamples / gexamp.c < prev    next >
C/C++ Source or Header  |  1997-07-22  |  3KB  |  136 lines

  1.  
  2. static char rcsid[] =
  3.     "$Id: gexamp.c,v 1.2 1997/07/09 13:27:57 pvmsrc Exp $";
  4.  
  5. /*
  6.  *         PVM version 3.4:  Parallel Virtual Machine System
  7.  *               University of Tennessee, Knoxville TN.
  8.  *           Oak Ridge National Laboratory, Oak Ridge TN.
  9.  *                   Emory University, Atlanta GA.
  10.  *      Authors:  J. J. Dongarra, G. E. Fagg, M. Fischer
  11.  *          G. A. Geist, J. A. Kohl, R. J. Manchek, P. Mucci,
  12.  *         P. M. Papadopoulos, S. L. Scott, and V. S. Sunderam
  13.  *                   (C) 1997 All Rights Reserved
  14.  *
  15.  *                              NOTICE
  16.  *
  17.  * Permission to use, copy, modify, and distribute this software and
  18.  * its documentation for any purpose and without fee is hereby granted
  19.  * provided that the above copyright notice appear in all copies and
  20.  * that both the copyright notice and this permission notice appear in
  21.  * supporting documentation.
  22.  *
  23.  * Neither the Institutions (Emory University, Oak Ridge National
  24.  * Laboratory, and University of Tennessee) nor the Authors make any
  25.  * representations about the suitability of this software for any
  26.  * purpose.  This software is provided ``as is'' without express or
  27.  * implied warranty.
  28.  *
  29.  * PVM version 3 was funded in part by the U.S. Department of Energy,
  30.  * the National Science Foundation and the State of Tennessee.
  31.  */
  32.  
  33. /*
  34.     Typical group example
  35. */
  36.  
  37. #include <stdio.h>
  38. #ifdef    SYSVSTR
  39. #include <string.h>
  40. #define RINDEX(s,c) strrchr(s,c)
  41. #else
  42. #include <strings.h>
  43. #define RINDEX(s,c) rindex(s,c)
  44. #endif
  45. #include "pvm3.h"
  46.  
  47. int
  48. main(argc, argv)
  49. int argc;
  50. char *argv[];
  51. {
  52.     int mytid, mygid, ctid[32];
  53.     int nproc, i, indx;
  54.     char *gp;
  55.  
  56.     mytid = pvm_mytid();
  57.     fprintf(stderr, "%s 0x%x enrolled\n", argv[0], mytid);
  58.     if (mytid < 0) {
  59.         pvm_perror(argv[0]);
  60.         return -1;
  61.         }
  62.  
  63.     if (argc != 2) goto usage;
  64.     if ((nproc = atoi(argv[1])) < 1) goto usage;
  65.     if (nproc > 32) goto usage;
  66.  
  67.     /* join a group */
  68.     /* the group name is the last path of the path name */
  69.     gp = RINDEX(argv[0],'/');
  70.     if (gp == 0) 
  71.         gp = argv[0];
  72.     else
  73.         gp++;
  74.     mygid = pvm_joingroup(gp);
  75.  
  76.     fprintf(stderr, "%s 0x%x %d\n", gp, mytid, mygid);
  77.     if (mygid < 0) {
  78.         pvm_exit();
  79.         return -1;
  80.     }
  81.  
  82.     /* if I'm the first to join then start the others */
  83.     if (mygid == 0) {
  84.         /* start a bunch of children */
  85.         pvm_spawn(gp, argv+1, PvmTaskDefault, "", nproc-1, ctid);
  86.         /* check them */
  87.         for (i = 0; i < nproc-1; i++)
  88.             fprintf(stderr, "0x%x\n", ctid[i]);
  89.         }
  90.  
  91.     /* sync on a barrier */
  92.     if (pvm_barrier(gp, nproc) < 0) {
  93.         pvm_perror(argv[0]);
  94.         pvm_lvgroup(argv[0]);
  95.         pvm_exit();
  96.         return -1;
  97.         }
  98.  
  99.     fprintf(stderr, "%s %d: sync\n", argv[0], mygid);
  100.  
  101.     /* everyone broadcast their gids and tids */
  102.     pvm_initsend(PvmDataDefault);
  103.     pvm_pkint(&mygid, 1, 1);
  104.     pvm_pkint(&mytid, 1, 1);
  105.     pvm_bcast(gp, 63);
  106.  
  107.     /* recv all the gids and tids (except from myself) */
  108.     ctid[mygid] = mytid;
  109.     for (i = 0; i < nproc-1; i++) {
  110.         pvm_recv(-1, 63);
  111.         pvm_upkint(&indx, 1, 1);
  112.         pvm_upkint(ctid+indx, 1, 1);
  113.         }
  114.  
  115.     /* check to make sure the gids and tids are correct */
  116.     for (i = 0; i < nproc; i++) {
  117.         if (i != pvm_getinst(gp, ctid[i])) {
  118.             fprintf(stderr, "gid %d doesn't match up!\n", i);
  119.             }
  120.         if (ctid[i] != pvm_gettid(gp, i)) {
  121.             fprintf(stderr, "gid %d doesn't match up!\n", i);
  122.             }
  123.         }
  124.  
  125.     /* leave the group */
  126.         pvm_barrier(gp,nproc);
  127.     if(pvm_lvgroup(gp) < 0)
  128.             pvm_perror(gp);
  129.  
  130.     pvm_exit();
  131.     return 0;
  132. usage:
  133.     fprintf(stderr, "usage: %s <nproc>\n", argv[0]);
  134.     return -1;
  135. }
  136.